#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);


}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_connectDB_clicked()
{
    // 导入数据库
    sqlite = QSqlDatabase::addDatabase("QSQLITE");
    // 设置数据库名称
    sqlite.setDatabaseName("studentDB.db");
    // 打开数据库。studentDB数据库存在，则打开；如果不存在，则创建
    if (!sqlite.open())
    {
        qDebug() << "创建连接数据库[studentDB.db]失败:" << sqlite.lastError().text();
    }
    qDebug() << "数据库创建成功";
}

void Widget::on_createTab_clicked()
{
    QString sql("CREATE TABLE student( \
                    id INTEGER PRIMARY KEY AUTOINCREMENT,\
                    name varchar(50) NOT NULL,\
                    age INTEGER,\
                    gpa REAL)\
                ");
    QSqlQuery query;
    if (!query.exec(sql))
    {
        qDebug() << "创建学生表[student]失败: " << query.lastError().text();
        return;
    }
    qDebug() << "创建学生表[student]成功";
}

void Widget::on_closeDB_clicked()
{
    sqlite.close();
    qDebug() << "数据库已经断开连接";
}

void Widget::on_insert_clicked()
{
    // 插入方式一
    QString sql("INSERT INTO student(id, name, age, gpa)\
                VALUES(1, '张三', 18, 3, 0)");
    sql.clear();
    // 插入方式二
    sql = "INSERT INTO student VALUES(2, '李四', 19, 3.5)";
    sql.clear();
    // 插入方式三
    sql = "INSERT INTO student VALUES(%1, '%2', %3, %4)";
    sql = sql.arg(3, 1, 10).arg("王五").arg(20, 2, 10).arg(3.8);
    QSqlQuery query;
    if (!query.exec(sql))
    {
        qDebug() << "学生表[student]插入数据失败: " << query.lastError().text();
        return;
    }

    // 提前准备数据插入，通过bindValue方式绑定实际值
    // 1，按照名称绑定
    query.prepare("INSERT INTO student(name, age, gpa) VALUES(:name, :age, :gpa)");
    query.bindValue(":name", "赵六");
    query.bindValue("age", 19); // ':'占位符的冒号可省略
    query.bindValue(":gpa", 4.0);
    if (!query.exec())
    {
        qDebug() << "学生表[student]插入数据失败: " << query.lastError().text();
        return;
    }
    query.clear();

    // 2，按照位置绑定。'?'是匿名占位符（匹配时按顺序匹配参数）
    query.prepare("INSERT INTO student(name, age gpa) VALUES(?, ?, ?)");
    query.bindValue(0, "田七");
    query.bindValue(1, 18);
    query.bindValue(2, 2.7);
    if (!query.exec())
    {
        qDebug() << "学生表[student]插入数据失败: " << query.lastError().text();
        return;
    }
    query.clear();

    query.prepare("INSERT INTO student(name, age gpa) VALUES(?, ?, ?)");
    query.addBindValue("王八");
    query.addBindValue(28);
    query.addBindValue(1.0);
    if (!query.exec())
    {
        qDebug() << "学生表[student]插入数据失败: " << query.lastError().text();
        return;
    }

    qDebug() << "数据插入成功";
}

void Widget::on_select_clicked()
{
    QString sql("SELECT * FROM student");
    QSqlQuery query;
    if (!query.exec(sql))
    {
        qDebug() << "学生表[student]查询数据失败: " << query.lastError().text();
        return;
    }

    // 打印查询记录
//    while(query.next())
//    {
//        qDebug() << query.value(0).toInt()
//                 << query.value(1).toString()
//                 << query.value(2).toInt()
//                 << query.value(3).toDouble();
//    }
    // 按照名称获取
    while(query.next())
    {
        qDebug() << query.value("id").toInt()
                 << query.value("name").toString()
                 << query.value("age").toInt()
                 << query.value("gpa").toDouble();
    }
}

void Widget::on_update_clicked()
{
    // 将王五的年龄修改为21，成绩修改为2.2
    QSqlQuery query;
    query.prepare("UPDATE student SET age = ?, gpa = ? WHERE name = ?");
    query.bindValue(0, 21);
    query.bindValue(1, 2.2);
    query.bindValue(2, "王五");
    if (!query.exec())
    {
        qDebug() << "学生表[student]更新数据失败: " << query.lastError().text();
        return;
    }

    query.prepare("SELECT * FROM student WHERE name = :name");
    query.bindValue(":name", "王五");
    if (!query.exec())
    {
        qDebug() << "学生表[student]查询数据失败: " << query.lastError().text();
        return;
    }

    while (query.next())
    {
        qDebug() << query.value("id").toInt()
                 << query.value("name").toString()
                 << query.value("age").toInt()
                 << query.value("gpa").toDouble();
    }
}

void Widget::on_delete_2_clicked()
{
    // 删除id为7的同学
    QSqlQuery query;
    query.prepare("DELETE FROM student WHERE id = ?");
    query.addBindValue(7);
    if (!query.exec())
    {
        qDebug() << "学生表[student]删除数据失败: " << query.lastError().text();
        return;
    }

    // 通过查询验证删除是否正确
    QString sql("SELECT * FROM student");
    if (!query.exec(sql))
    {
        qDebug() << "学生表[student]查询数据失败: " << query.lastError().text();
        return;
    }

    // 按照名称获取
    while (query.next())
    {
        qDebug() << query.value("id").toInt()
                 << query.value("name").toString()
                 << query.value("age").toInt()
                 << query.value("gpa").toDouble();
    }
}
